import sys, os, pwd, grp, signal, time, glob
from resource_management import *
from subprocess import call


class Master(Script):
    def install(self, env):
        import params
        import status_params

        stable_package = 'https://archive.apache.org/dist/tomcat/tomcat-8/v8.0.30/src/apache-tomcat-8.0.30-src.tar.gz'

        self.create_linux_user(params.tomcat_user, params.tomcat_group)

        # 创建/var/run/tomcat和/var/log/tomcat这两个文件夹
        Directory([status_params.tomcat_pid_dir, params.tomcat_log_dir],
                  owner=params.tomcat_user,
                  group=params.tomcat_group,
                  create_parents=True
                  )

        # 创建一个/var/log/tomcat/tomcat_setup.log文件
        Execute('touch ' + params.tomcat_log_file, user=params.tomcat_user)

        # 删除/opt/apache-tomcat-8.0.30-src
        Execute('rm -rf ' + params.tomcat_dir, ignore_failures=True)

        # 删除/tmp/apache-tomcat-8.0.30-src.tar.gz
        Execute('rm -rf ' + params.temp_file, ignore_failures=True)

        # 之前删除了，再创建/opt/apache-tomcat-8.0.30-src，和后面的解压文件名有冲突
        Execute('mkdir -p ' + params.tomcat_dir)

        # 参数R，改变目录的用户和用户组,也就改了apache-tomcat-8.0.30-src
        Execute('chown -R ' + params.tomcat_user + ':' + params.tomcat_group + ' ' + params.tomcat_dir)
        Execute('echo Installing pachages')

        # 判断文件存在，之后开始下载安装包到/tmp/apache-tomcat-8.0.30-src.tar.gz
        if not os.path.exists(params.temp_file):
            Execute('wget ' + stable_package + ' -O ' + params.temp_file)

        # 解压安装包里面文件到/opt文件夹下，参数C表示解压到文件夹下，解压后文件夹是/opt/apache-tomcat-8.0.30-src
        # 而且解压后没有logs这个文件夹
        Execute('tar zxvf ' + params.temp_file + ' -C ' + params.tomcat_install_dir)

        # 删除安装包
        Execute('rm -rf ' + params.temp_file)

        # 这个是后面的函数
        self.configure(env, True)

        # This allows us to access the params.api_pid_file property as
        # format('{api_pid_file}')
        # env.set_params(params)

        # Install dependent packages
        # self.install_packages(env)


    # 创建linux用户函数
    def create_linux_user(self, user, group):
        try:
            pwd.getpwnam(user)
        except KeyError:
            Execute('adduser ' + user)
        try:
            grp.getgrnam(group)
        except KeyError:
            Execute('groupadd ' + group)

    # 这个函数没什么吊用，format时可以用
    def configure(self, env, isInstall=False):
        import params
        import status_params
        env.set_params(params)
        env.set_params(status_params)

    def stop(self, env):
        import params
        import status_params
        self.set_conf_bin(env)
        Execute(params.bin_dir + '/shutdown.sh >>' + params.tomcat_log_file, user=params.tomcat_user)
        Execute('rm -rf ' + status_params.tomcat_pid_file)

    def start(self, env):
        import params
        import status_params
        self.configure(env)
        self.set_conf_bin(env)
        # 创建/var/lock/subsys/tomcat文件夹
        Execute('touch ' + params.tomcat_lock_file)
        Execute('chown ' + params.tomcat_user + ':' + params.tomcat_group + ' ' + params.tomcat_lock_file)
        # 执行启动脚本
        Execute(params.bin_dir + '/startup.sh >> ' + params.tomcat_log_file, user=params.tomcat_user)
        # -p递归创建目录，/var/rum/tomcat
        Execute('mkdir -p ' + status_params.tomcat_pid_dir)
        Execute('chown -R ' + params.tomcat_user + ':' + params.tomcat_group + ' ' + status_params.tomcat_pid_dir)
        Execute('ps -ef | grep -i tomcat | awk {\'print $2\'} | head -n 1 > ' + status_params.tomcat_pid_file,
                user=params.tomcat_user)

    def status(self, env):
        import status_params
        check_process_status(status_params.tomcat_pid_file)

    def set_conf_bin(self, env):
        import params
        # 合成文件夹，所以就是/opt/apache-tomcat-8.0.30-src/conf
        params.conf_dir = os.path.join(*[params.tomcat_install_dir, params.tomcat_dirname, 'conf'])
        # 合成文件夹，是/opt/apache-tomcat-8.0.30-src/bin
        params.bin_dir = os.path.join(*[params.tomcat_install_dir, params.tomcat_dirname, 'bin'])


if __name__ == "__main__":
    Master().execute()
